package threads;

public class Anhalter {
  private static int zahl;
  private static boolean weiter;

  public static void main(String[] args) throws InterruptedException{
    weiter=true;
    Thread derandere=new Thread(){//eine Instanz aus anonymous Class
      public void run(){
        int i=0;
        while(weiter){
          i++;
          System.out.print(i+" ");
        }
        /*if(weiter) //das darf der Compiler so verstehen
          while(true){
            i++;
            System.out.print(i+" ");
          }*/
      }
    };
    derandere.start(); //der andere wird gestartet.
    Thread.sleep(1000);//dieser schläft 1 Sekunde.
    weiter=false;      //der andere hält NICHT UNBEDINGT an.
  }

  public static int laufendeNummer(){
    return ++zahl;
  }
}
/*
0. synchronized als gegenseitige Ausschlusstechnik: siehe duschende Familie
1. synchronized für Synchronisierung s.o.
   1.1 ohne synchronized
   1.2 synchronisiere anhalten() und angehalten()
   1.3 Warum beides?
   1.4 Warum mit dem selben Lock? (happens before; siehe JLS Kapitel 17)
   1.5 ohne gegenseitgen Ausschlussbedarf: volatile
   1.6 Hat die Familiendusche ein Synchronisationsproblem?
   1.7 Kann man die Fernbedienung als Lock für die Dusche verwenden?
2. Ersetzen durch: interrupt(), isInterrupted(), interrupted()
   - bei normalen Tätigkeiten nur merken für später
   - bei wait, sleep, join, ... sofort reagieren
3. Atomizität am Beispiel laufendeNummer
   3.1 Problematik
   3.2 erweiterte Problematik bei long und double
   3.3 Lösungen

Tipps:
======
- synchronized = Eintrittsbeschränkung UND/ODER gegenseitiger Datenabgleich
- Strategien:
  - verwende keine veränderlichen Daten zwischen verschiedenen Threads
  - verwende nicht-veränderlichen Daten (immutable) zwischen verschiedenen Threads
  - Wenn veränderliche Daten nötig sind, lasse nur einen Thread drauf los, oder
    verändere die Daten nicht mehr, nachdem mehrere Threads drauf zugreifen
    (erzwinge dies geeignet)!
  - Oder synchronisiere ordentlich
- Verwende wenn möglich das Package concurrent
*/
